機械学習 - ランダムサーチ(Random Search)
目次
この投稿では、マシンラーニングでモデルの性能を最大化するためのハイパーパラメータチューニングの一つであるランダムサーチ(Random Search)の概念を説明し、Scikit-learnライブラリを使用した実装例を紹介します。
ランダムサーチとは? #
ランダムサーチは、指定されたパラメータ空間内で無作為に選択された組み合わせを評価することで、ハイパーパラメータの最適な組み合わせを見つける方法です。グリッドサーチ(Grid Search)が指定されたパラメータの全ての組み合わせを体系的に探索するのに対し、ランダムサーチは探索空間からランダムに組み合わせを選択して評価します。特にハイパーパラメータの次元が高い場合や、探索空間が大きい場合に有用で、しばしばより少ない時間で同等またはそれ以上の結果を出すことができます。
主要パラメータ #
Scikit-learnでRandomizedSearchCVクラスを通じてランダムサーチを実装できます。主要なパラメータは以下の通りです:
- estimator: 最適化するモデルを指定します。例えば、RandomForestClassifier()、SVC()などです。
- param_distributions: 探索するパラメータ空間を指定します。各パラメータに対して連続分布を指定するか、リストを提供できます。
- n_iter: 無作為に選択するパラメータ設定の数を指定します。この値が大きいほど、より多くの組み合わせを探索しますが、計算時間も増加します。
- scoring: モデルの性能を評価する基準を指定します。例えば、「accuracy」、「f1」などです。
- cv: 交差検証の分割戦略を指定します。整数値を入力すると、その値でk-fold交差検証を実行します。
- random_state: 結果の再現性を確保するために、乱数生成器のシード値を指定します。
RandomizedSearchCVの実装 #
以下はRandomizedSearchCVを使用して分類器の最適なハイパーパラメータを見つける例です。以下のコードではサポートベクターマシン(SVM)を使用しています。
>>> from sklearn.model_selection import RandomizedSearchCV
>>> from sklearn.svm import SVC
>>> from sklearn.datasets import load_iris
>>> from sklearn.model_selection import train_test_split
>>> import scipy.stats as stats
# データをロードする
>>> iris = load_iris()
>>> X, y = iris.data, iris.target
# データセットを訓練セットとテストセットに分割
>>> X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# サポートベクターマシンのインスタンス化
>>> svc = SVC()
# 探索するハイパーパラメータ空間の定義
>>> param_distributions = {
'C': stats.uniform(0.1, 1000),
'gamma': stats.uniform(0.0001, 0.1),
'kernel': ['linear', 'rbf']
}
# RandomizedSearchCVのインスタンス化
>>> random_search.fit(X_train, y_train)
# 最適なパラメータと最高の精度を出力
>>> print("Best parameters:", random_search.best_params_)
>>> print("Best cross-validation score: {:.2f}".format(random_search.best_score_))
# テストセットでの性能評価
>>> accuracy = random_search.score(X_test, y_test)
>>> print("Test set accuracy: {:.2f}".format(accuracy))
このコードは、指定されたC、gamma、kernelハイパーパラメータのランダムな組み合わせを探索し、最適な組み合わせを見つけます。RandomizedSearchCVは特に探索空間が広い場合に、グリッドサーチよりも効果的な方法です。